package com.jzoffer;

import java.util.Arrays;

/*
* 一个整型数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
* */
public class TheTwoDifferentNum {
    public static void main(String[] args) {
        int[] arr = {1,1,2,2,3,3,4,4,5,7,8,8,9,9};
        int[] ints = FindNumsAppearOnce(arr);
        System.out.println(Arrays.toString(ints));
    }

    // 使用异或和&
    public static int[] FindNumsAppearOnce(int [] array){
        if(array == null || array.length < 1){
            return new int[0];
        }
        int different = 0;
        // 找出两个不同的数的异或值
        for(int num:array){
            different ^= num;
        }

        // 找出两个数第一个1出现的位置
        // 由此分开计算
        int one = different & (-different);
        int[] two = new int[2];
        for (int num:array){
            if((num & one) == 0){
                two[0] ^= num;
            }else{
                two[1] ^= num;
            }
        }
        return two;

    }



}
